home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 24 / AACD 24.iso / AACD / Sound / LAME / WarpOS / src / dshow / PropPage_adv.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2001-03-15  |  10.6 KB  |  399 lines

  1. /*
  2.  *    MPEG Audio Encoder for DirectShow
  3.  *    Advanced property page
  4.  *
  5.  *    Copyright (c) 2000 Marie Orlova, Peter Gubanov, Elecard Ltd.
  6.  *
  7.  * This library is free software; you can redistribute it and/or
  8.  * modify it under the terms of the GNU Library General Public
  9.  * License as published by the Free Software Foundation; either
  10.  * version 2 of the License, or (at your option) any later version.
  11.  *
  12.  * This library is distributed in the hope that it will be useful,
  13.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.     See the GNU
  15.  * Library General Public License for more details.
  16.  *
  17.  * You should have received a copy of the GNU Library General Public
  18.  * License along with this library; if not, write to the
  19.  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  20.  * Boston, MA 02111-1307, USA.
  21.  */
  22.  
  23. #include <streams.h>
  24. #include <olectl.h>
  25. #include <olectlid.h>
  26. #include <commctrl.h>
  27. #include "iaudioprops.h"
  28. #include "mpegac.h"
  29. #include "resource.h"
  30. #include "PropPage_adv.h"
  31. #include "Reg.h"
  32.  
  33. // Strings which apear in comboboxes
  34. const char *chChMode[4] =     {"Mono",
  35.                         "Standard stereo",
  36.                         "Joint stereo",
  37.                         "Dual stereo"};
  38.  
  39. ////////////////////////////////////////////////////////////////
  40. // CreateInstance
  41. ////////////////////////////////////////////////////////////////
  42. CUnknown *CMpegAudEncPropertyPageAdv::CreateInstance( LPUNKNOWN punk, HRESULT *phr )
  43. {
  44.     CMpegAudEncPropertyPageAdv *pNewObject
  45.         = new CMpegAudEncPropertyPageAdv( punk, phr );
  46.  
  47.     if( pNewObject == NULL )
  48.         *phr = E_OUTOFMEMORY;
  49.  
  50.     return pNewObject;
  51. }
  52.  
  53. ////////////////////////////////////////////////////////////////
  54. // Constructor
  55. ////////////////////////////////////////////////////////////////
  56. CMpegAudEncPropertyPageAdv::CMpegAudEncPropertyPageAdv(LPUNKNOWN punk, HRESULT *phr)
  57.  : CBasePropertyPage(NAME("Encoder Advanced Property Page"), 
  58.                       punk, IDD_ADVPROPS, IDS_AUDIO_ADVANCED_TITLE)                      
  59.     , m_pAEProps(NULL)
  60.     , m_fWindowInactive(TRUE)
  61. {
  62.     ASSERT(phr);
  63.  
  64.     InitCommonControls();
  65. }
  66.  
  67. //
  68. // OnConnect
  69. //
  70. // Give us the filter to communicate with
  71. HRESULT CMpegAudEncPropertyPageAdv::OnConnect(IUnknown *pUnknown)
  72. {
  73.     ASSERT(m_pAEProps == NULL);
  74.  
  75.     // Ask the filter for it's control interface
  76.  
  77.     HRESULT hr = pUnknown->QueryInterface(IID_IAudioEncoderProperties,(void **)&m_pAEProps);
  78.     if (FAILED(hr)) {
  79.         return E_NOINTERFACE;
  80.     }
  81.  
  82.     ASSERT(m_pAEProps);
  83.  
  84.     // Get current filter state
  85.     m_pAEProps->LoadAudioEncoderPropertiesFromRegistry();
  86.  
  87.     m_pAEProps->get_EnforceVBRmin(&m_dwEnforceVBRmin);
  88.     m_pAEProps->get_VoiceMode(&m_dwVoiceMode);
  89.     m_pAEProps->get_KeepAllFreq(&m_dwKeepAllFreq);
  90.     m_pAEProps->get_StrictISO(&m_dwStrictISO);
  91.     m_pAEProps->get_NoShortBlock(&m_dwNoShortBlock);
  92.     m_pAEProps->get_XingTag(&m_dwXingTag);
  93.     m_pAEProps->get_ChannelMode(&m_dwChannelMode);
  94.     m_pAEProps->get_ForceMS(&m_dwForceMS);
  95.     m_pAEProps->get_ModeFixed(&m_dwModeFixed);
  96.     return NOERROR;
  97. }
  98.  
  99. //
  100. // OnDisconnect
  101. //
  102. // Release the interface
  103.  
  104. HRESULT CMpegAudEncPropertyPageAdv::OnDisconnect()
  105. {
  106.     // Release the interface
  107.     if (m_pAEProps == NULL) {
  108.         return E_UNEXPECTED;
  109.     }
  110.  
  111.     m_pAEProps->set_EnforceVBRmin(m_dwEnforceVBRmin);
  112.     m_pAEProps->set_VoiceMode(m_dwVoiceMode);
  113.     m_pAEProps->set_KeepAllFreq(m_dwKeepAllFreq);
  114.     m_pAEProps->set_StrictISO(m_dwStrictISO);
  115.     m_pAEProps->set_NoShortBlock(m_dwNoShortBlock);
  116.     m_pAEProps->set_XingTag(m_dwXingTag);
  117.     m_pAEProps->set_ChannelMode(m_dwChannelMode);
  118.     m_pAEProps->set_ForceMS(m_dwForceMS);
  119.     m_pAEProps->set_ModeFixed(m_dwModeFixed);
  120.     m_pAEProps->SaveAudioEncoderPropertiesToRegistry();
  121.  
  122.     m_pAEProps->Release();
  123.     m_pAEProps = NULL;
  124.     return NOERROR;
  125. }
  126.  
  127. //
  128. // OnActivate
  129. //
  130. // Called on dialog creation
  131.  
  132. HRESULT CMpegAudEncPropertyPageAdv::OnActivate(void)
  133. {
  134.     InitPropertiesDialog(m_hwnd);
  135.  
  136.     m_fWindowInactive = FALSE;
  137.  
  138.     return NOERROR;
  139. }
  140.  
  141. //
  142. // OnDeactivate
  143. //
  144. // Called on dialog destruction
  145.  
  146. HRESULT CMpegAudEncPropertyPageAdv::OnDeactivate(void)
  147. {
  148.     m_fWindowInactive = TRUE;
  149.     return NOERROR;
  150. }
  151.  
  152. ////////////////////////////////////////////////////////////////
  153. // OnReceiveMessage - message handler function
  154. ////////////////////////////////////////////////////////////////
  155. BOOL CMpegAudEncPropertyPageAdv::OnReceiveMessage(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
  156. {
  157.     switch( uMsg )
  158.     {
  159.     
  160.     case WM_COMMAND:
  161.         switch (LOWORD(wParam))
  162.         {
  163.  
  164.         case IDC_RADIO_STEREO:
  165.         case IDC_RADIO_JSTEREO:
  166.         case IDC_RADIO_DUAL:
  167.         case IDC_RADIO_MONO:
  168.             {
  169.  
  170.                 DWORD dwChannelMode = LOWORD(wParam)-IDC_RADIO_STEREO;
  171.                 CheckRadioButton(hwnd,IDC_RADIO_STEREO,IDC_RADIO_MONO,
  172.                     LOWORD(wParam));
  173.  
  174.                 if (dwChannelMode == JOINT_STEREO)
  175.                     EnableWindow(GetDlgItem(hwnd,IDC_CHECK_FORCE_MS),TRUE);
  176.                 else
  177.                     EnableWindow(GetDlgItem(hwnd,IDC_CHECK_FORCE_MS),FALSE);
  178.  
  179.                 m_pAEProps->set_ChannelMode(dwChannelMode);
  180.                 SetDirty();
  181.             }
  182.             break;
  183.  
  184.     /*    case IDC_COMBO_CHMOD:
  185.             if (HIWORD(wParam) == CBN_SELCHANGE)
  186.             {
  187.                 int nChannelMode = SendDlgItemMessage(hwnd, IDC_COMBO_CHMOD, CB_GETCURSEL, 0, 0L);
  188.                 DWORD dwChannelMode;
  189.  
  190.                 switch(nChannelMode) 
  191.                 {
  192.                     case 0: 
  193.                         dwChannelMode = MPGA_CHMOD_MONO;
  194.                         break;
  195.                     case 1:
  196.                         dwChannelMode = MPGA_CHMOD_STEREO;
  197.                         break;
  198.                     case 2:
  199.                         dwChannelMode = MPGA_CHMOD_JOINT;
  200.                         break;
  201.                     case 3:
  202.                         dwChannelMode = MPGA_CHMOD_DUAL;
  203.                         break;
  204.                     default:
  205.                         m_pAEProps->get_ChannelMode(&dwChannelMode);
  206.                         break;
  207.                 }
  208.  
  209.                 m_pAEProps->set_ChannelMode(dwChannelMode);
  210.  
  211.                 SetDirty();
  212.             }
  213.             break;
  214. */
  215.         case IDC_CHECK_ENFORCE_MIN:
  216.             m_pAEProps->set_EnforceVBRmin(IsDlgButtonChecked(hwnd, IDC_CHECK_ENFORCE_MIN));
  217.             SetDirty();
  218.             break;
  219.  
  220.         case IDC_CHECK_VOICE:
  221.             m_pAEProps->set_VoiceMode(IsDlgButtonChecked(hwnd, IDC_CHECK_VOICE));
  222.             SetDirty();
  223.             break;
  224.  
  225.         case IDC_CHECK_KEEP_ALL_FREQ:
  226.             m_pAEProps->set_KeepAllFreq(IsDlgButtonChecked(hwnd, IDC_CHECK_KEEP_ALL_FREQ));
  227.             SetDirty();
  228.             break;
  229.  
  230.         case IDC_CHECK_STRICT_ISO:
  231.             m_pAEProps->set_StrictISO(IsDlgButtonChecked(hwnd, IDC_CHECK_STRICT_ISO));
  232.             SetDirty();
  233.             break;
  234.  
  235.         case IDC_CHECK_DISABLE_SHORT_BLOCK:
  236.             m_pAEProps->set_NoShortBlock(IsDlgButtonChecked(hwnd, IDC_CHECK_DISABLE_SHORT_BLOCK));
  237.             SetDirty();
  238.             break;
  239.  
  240.         case IDC_CHECK_XING_TAG:
  241.             m_pAEProps->set_XingTag(IsDlgButtonChecked(hwnd, IDC_CHECK_XING_TAG));
  242.             SetDirty();
  243.             break;
  244.  
  245.         case IDC_CHECK_FORCE_MS:
  246.             m_pAEProps->set_ForceMS(IsDlgButtonChecked(hwnd, IDC_CHECK_FORCE_MS));
  247.             SetDirty();
  248.             break;
  249.  
  250.         case IDC_CHECK_MODE_FIXED:
  251.             m_pAEProps->set_ModeFixed(IsDlgButtonChecked(hwnd, IDC_CHECK_MODE_FIXED));
  252.             SetDirty();
  253.             break;
  254.         }
  255.         return TRUE;
  256.  
  257.     case WM_DESTROY:
  258.         return TRUE;
  259.  
  260.     default:
  261.         return FALSE;
  262.     }
  263.  
  264.     return TRUE;
  265. }
  266.  
  267. //
  268. // OnApplyChanges
  269. //
  270. HRESULT CMpegAudEncPropertyPageAdv::OnApplyChanges() 
  271. {
  272.     m_pAEProps->get_EnforceVBRmin(&m_dwEnforceVBRmin);
  273.     m_pAEProps->get_VoiceMode(&m_dwVoiceMode);
  274.     m_pAEProps->get_KeepAllFreq(&m_dwKeepAllFreq);
  275.     m_pAEProps->get_StrictISO(&m_dwStrictISO);
  276.     m_pAEProps->get_ChannelMode(&m_dwChannelMode);
  277.     m_pAEProps->get_ForceMS(&m_dwForceMS);
  278.     m_pAEProps->get_NoShortBlock(&m_dwNoShortBlock);
  279.     m_pAEProps->get_XingTag(&m_dwXingTag);
  280.     m_pAEProps->get_ModeFixed(&m_dwModeFixed);
  281.     m_pAEProps->SaveAudioEncoderPropertiesToRegistry();
  282.  
  283.     return S_OK; 
  284. }
  285.  
  286. //
  287. // Initialize dialogbox controls with proper values
  288. //
  289. void CMpegAudEncPropertyPageAdv::InitPropertiesDialog(HWND hwndParent)
  290. {
  291.     EnableControls(hwndParent, TRUE);
  292.  
  293.     
  294.     //
  295.     // initialize radio bottons
  296.     //
  297.     DWORD dwChannelMode;
  298.     m_pAEProps->get_ChannelMode(&dwChannelMode);
  299.     CheckRadioButton(hwndParent,IDC_RADIO_STEREO,IDC_RADIO_MONO,
  300.         IDC_RADIO_STEREO+dwChannelMode);
  301.  
  302.  
  303.     if (dwChannelMode == JOINT_STEREO)
  304.         EnableWindow(GetDlgItem(hwndParent,IDC_CHECK_FORCE_MS),TRUE);
  305.     else
  306.         EnableWindow(GetDlgItem(hwndParent,IDC_CHECK_FORCE_MS),FALSE);
  307.     
  308.  
  309.  
  310.  
  311.     /*
  312.     SendDlgItemMessage(hwndParent, IDC_COMBO_CHMOD, CB_RESETCONTENT, 0, 0L);
  313.     if(dwChannels == 2)
  314.     {
  315.         for(int i = 0; i < 4; i++)
  316.             SendDlgItemMessage(hwndParent, IDC_COMBO_CHMOD, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)chChMode[i]);
  317.     }
  318.     else
  319.         SendDlgItemMessage(hwndParent, IDC_COMBO_CHMOD, CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)chChMode[0]);
  320. */
  321.  
  322.  
  323.  
  324.     //
  325.     // initialize checkboxes
  326.     //
  327.     DWORD dwEnforceVBRmin;
  328.     m_pAEProps->get_EnforceVBRmin(&dwEnforceVBRmin);
  329.     CheckDlgButton(hwndParent, IDC_CHECK_ENFORCE_MIN, dwEnforceVBRmin ? BST_CHECKED : BST_UNCHECKED);
  330.  
  331.     DWORD dwVoiceMode;
  332.     m_pAEProps->get_VoiceMode(&dwVoiceMode);
  333.     CheckDlgButton(hwndParent, IDC_CHECK_VOICE, dwVoiceMode ? BST_CHECKED : BST_UNCHECKED);
  334.  
  335.     DWORD dwKeepAllFreq;
  336.     m_pAEProps->get_KeepAllFreq(&dwKeepAllFreq);
  337.     CheckDlgButton(hwndParent, IDC_CHECK_KEEP_ALL_FREQ, dwKeepAllFreq ? BST_CHECKED : BST_UNCHECKED);
  338.  
  339.     DWORD dwStrictISO;
  340.     m_pAEProps->get_StrictISO(&dwStrictISO);
  341.     CheckDlgButton(hwndParent, IDC_CHECK_STRICT_ISO, dwStrictISO ? BST_CHECKED : BST_UNCHECKED);
  342.  
  343.     DWORD dwNoShortBlock;
  344.     m_pAEProps->get_NoShortBlock(&dwNoShortBlock);
  345.     CheckDlgButton(hwndParent, IDC_CHECK_DISABLE_SHORT_BLOCK, dwNoShortBlock ? BST_CHECKED : BST_UNCHECKED);
  346.  
  347.     DWORD dwXingEnabled;
  348.     m_pAEProps->get_XingTag(&dwXingEnabled);
  349.     CheckDlgButton(hwndParent, IDC_CHECK_XING_TAG, dwXingEnabled ? BST_CHECKED : BST_UNCHECKED);
  350.  
  351.     DWORD dwForceMS;
  352.     m_pAEProps->get_ForceMS(&dwForceMS);
  353.     CheckDlgButton(hwndParent, IDC_CHECK_FORCE_MS, dwForceMS ? BST_CHECKED : BST_UNCHECKED);
  354.  
  355.     DWORD dwModeFixed;
  356.     m_pAEProps->get_ModeFixed(&dwModeFixed);
  357.     CheckDlgButton(hwndParent, IDC_CHECK_MODE_FIXED, dwModeFixed ? BST_CHECKED : BST_UNCHECKED);
  358.  
  359. }
  360.  
  361.  
  362. ////////////////////////////////////////////////////////////////
  363. // EnableControls
  364. ////////////////////////////////////////////////////////////////
  365. void CMpegAudEncPropertyPageAdv::EnableControls(HWND hwndParent, bool bEnable)
  366. {   
  367.     EnableWindow(GetDlgItem(hwndParent, IDC_CHECK_ENFORCE_MIN), bEnable);
  368.     EnableWindow(GetDlgItem(hwndParent, IDC_RADIO_STEREO), bEnable);
  369.     EnableWindow(GetDlgItem(hwndParent, IDC_RADIO_JSTEREO), bEnable);
  370.     EnableWindow(GetDlgItem(hwndParent, IDC_RADIO_DUAL), bEnable);
  371.     EnableWindow(GetDlgItem(hwndParent, IDC_RADIO_MONO), bEnable);
  372.     EnableWindow(GetDlgItem(hwndParent, IDC_CHECK_FORCE_MS), bEnable);
  373.     EnableWindow(GetDlgItem(hwndParent, IDC_CHECK_VOICE), bEnable);
  374.     EnableWindow(GetDlgItem(hwndParent, IDC_CHECK_KEEP_ALL_FREQ), bEnable);
  375.     EnableWindow(GetDlgItem(hwndParent, IDC_CHECK_STRICT_ISO), bEnable);
  376.     EnableWindow(GetDlgItem(hwndParent, IDC_CHECK_DISABLE_SHORT_BLOCK), bEnable);
  377.     EnableWindow(GetDlgItem(hwndParent, IDC_CHECK_XING_TAG), bEnable);
  378.     EnableWindow(GetDlgItem(hwndParent, IDC_CHECK_MODE_FIXED), bEnable);
  379.     
  380.  
  381.  
  382.  
  383.     
  384.     
  385. }
  386.  
  387. //
  388. // SetDirty
  389. //
  390. // notifies the property page site of changes
  391.  
  392. void CMpegAudEncPropertyPageAdv::SetDirty()
  393. {
  394.     m_bDirty = TRUE;
  395.     if (m_pPageSite)
  396.         m_pPageSite->OnStatusChange(PROPPAGESTATUS_DIRTY);
  397. }
  398.  
  399.